/*
 * Copyright (c) 2025 Advanced Micro Devices, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 * contributors may be used to endorse or promote products derived from this
 * software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef __ARCH_AMDGPU_COMMON_DTYPE_PACKED_TYPES_HH__
#define __ARCH_AMDGPU_COMMON_DTYPE_PACKED_TYPES_HH__

#include "arch/amdgpu/common/dtype/mxfp_types.hh"

namespace gem5
{

namespace AMDGPU
{

class PkBfloat16
{
  public:
    AMDGPU::mxbfloat16 data[2];

    uint32_t get() { return data[0].data | (uint32_t(data[1].data) << 16); }

    PkBfloat16 operator+=(const PkBfloat16& rhs)
    {
        data[0] = data[0] + rhs.data[0];
        data[1] = data[1] + rhs.data[1];
        return *this;
    }

    PkBfloat16 operator+(const PkBfloat16& rhs)
    {
        data[0] = data[0] + rhs.data[0];
        data[1] = data[1] + rhs.data[1];
        return *this;
    }

    // Conversions
    PkBfloat16 operator=(const int& rhs)
    {
        data[0].data = bits(rhs, 15, 0);
        data[1].data = bits(rhs, 31, 16);
        return *this;
    }
};

} // namespace AMDGPU

} // namespace gem5

#endif // __ARCH_AMDGPU_COMMON_DTYPE_PACKED_TYPES_HH__
